perm filename QUAIL[1,BGB] blob
sn#131880 filedate 1974-11-21 generic text, type T, neo UTF8
00100 TITLE QUAIL - TEXT ROUTINES.
00200 SUBR(KLTEXT,NODE)
00300 COMMENT ⊗____________________________________________________________
00400 If called with vertex, all text on that vertex is deleted.
00500 If called with a text node, only that line is deleted.
00600 Returns previous node.
00700 Uses AC 0-1, Transparent wrt to other AC's. ⊗
00800 ACCUMULATORS{LAST,NEXT}
00900 LAC 1,NODE
01000 TEST 1,VBIT
01100 GO KLLINE
01200 PTEXT 1,1 ;Get text pointer
01300 JUMPE 1,POP1J. ;None there
01400 TESTZ 1,VBIT ;Is it a vertex?
01500 POP1J ;Oops, a TJOINT, return
01600 PUSHP NEXT
01700 VLOOP: TCCW NEXT,1 ;Save pointer to next node
01800 CALL(KLNODE,1) ;Kill a text node
01900 LAC 1,NEXT ;Get back pointer to next node
02000 JUMPN 1,VLOOP ;Repeat until NIL is found.
02100 POPP NEXT
02200 POP1J
02300 KLLINE: PUSHP LAST↔PUSHP NEXT ;Save old LAST and NEXT
02400 TCW LAST,1 ;Save pointer to LAST
02500 KLLOOP: TCCW NEXT,1 ;Save pointer to NEXT
02600 TEST 1,CONBIT ;Last in line?
02700 GO LAST1 ;Yes
02800 CALL(KLNODE,1) ;Kill this node
02900 LAC 1,NEXT ;Get back pointer to next node
03000 GO KLLOOP ;Repeat for rest of line
03100 LAST1: CALL(KLNODE,1) ;Kill last node in line
03200 TESTZ LAST,VBIT ;Is previous a vertex.?
03300 GO [ PTEXT. NEXT,LAST ;Yes, use a different pointer
03400 GO LAST2 ]
03500 TCCW. NEXT,LAST ;New forward link
03600 LAST2: JUMPE NEXT,LAST3 ;Don't try to store into NIL!
03700 TCW. LAST,NEXT ;New backward link
03800 LAST3: LAC 1,LAST
03900 POPP LAST↔POPP NEXT ;Restore AC 2 and 3
04000 POP1J
04100
04200 ENDR KLTEXT;5/4/73(TVR)----------------------------------------------
00100 SUBR(SETEXT,NODE,SUBRLOC)
00200 COMMENT ⊗____________________________________________________________
00300 Called with a text node and the address of a subroutine which
00400 fetches a character and skips if successful, with character in AC.1.
00500 SETEXT returns on failure from character fetching subroutine or when
00600 a <line feed> or <alt mode> is seen. Leaves terminating character
00700 in AC.1. Uses AC 0-3. Calls KLTEXT. ⊗
00800 ACCUMULATORS {PTR,N}
00900 LAC N,NODE
01000 NDLOOP: CALL SETPTR ;Set up count and byte pointer
01100 CHLOOP: PUSHJ P,@SUBRLOC ;Call character fetching routine
01200 GO CHDONE ;Failure return
01300 JUMPE 1,CHLOOP ;Ignore nulls for now
01400 CAIN 1,15 ;CROCKISHNESS!!!
01500 GO CHLOOP
01600 CAIE 1,12 ;Terminate in <line feed>
01700 CAIN 1,175 ;or <alt mode>
01800 GO CHDONE
01900 SOJGE 0,DEPCHR ;Make sure it fits
02000 TESTZ N,CONBIT ;Need another block
02100 GO [ TCCW N,N ;This line already has one, use it
02200 GO GOTNODE ]
02300 PUSHP 1 ;Save character over MKNODE
02400 TCCW PTR,N ;Get next node
02500 CALL(MKNODE↑,[$TEXT]) ;Make a new text node
02600 TCCW. PTR,1 ;Make new forward links
02700 TCCW. 1,N
02800 TCW. N,1 ;Make new backward links
02900 SKIPE PTR↔TCW. 1,PTR ;Don't store into NIL
03000 MARK N,CONBIT ;Turn on bit indication this is continued
03100 LAC N,1 ;Now use this node
03200 POPP 1 ;Get back character
03300 GOTNOD: CALL SETPTR ;Set up count and byte pointer
03400 DEPCHR: IDPB 1,PTR ;Deposit character into text node
03500 GO CHLOOP ;Back for more
03600 CHDONE: PUSHP 1 ;Save terminator
03700 SETZ 1, ;Fill remainder of node with nulls
03800 ZPLOOP: SOJGE 0,[ IDPB 1,PTR
03900 GO ZPLOOP]
04000 TEST N,CONBIT ;Is there more on this line?
04100 GO FIN
04200 MARKZ N,CONBIT ;Turn off bit indicating more in line
04300 TCCW N,N ;Get next node
04400 CALL(KLTEXT,N) ;Kill rest of line
04500 FIN: POPP 1 ;Get terminating character
04600 POP2J ;Return
04700
04800 SETPTR: LAC PTR,N ;Make byte pointer to word number 1
04900 HRLI PTR,000700
05000 MOVEI 0,5*8-1 ;Number of characters per node
05100 POPJ P,
05200 ENDR SETEXT;4-MAY-73(TVR)____________________________________________
00100 SUBR(EDTEXT,NODE)
00200 COMMENT ⊗------------------------------------------------------------
00300 ⊗↔ ACCUMULATORS{T1,T2,T3,COUNT,SIGN,CHAR,N}
00400 LAC N,NODE
00500 TESTZ N,VBIT↔PY N,N
00600 JUMPE N,[ CALL (MKY,NODE,[.RLTXT])
00700 MARK 1,VBIT
00800 LAC N,NODE
00900 HRLZI 0,XWC(N) ;COPY CO-ORDINATES
01000 HRRI 0,XWC(1)
01100 BLT 0,ZWC(1)
01200 LAC N,1 ;SET SIZE TO 1
01300 LACI 0,1
01400 DPSIZ. 0,N
01500 GO NEWTXT ]
01600 SETOM EDUPDATE
01700 SETZM ENDFLG
01800 TESTZ N,VBIT↔PTEXT N,N
01900 LOOP0: SETZ CHAR,
02000 LOOP: CALL(EDDPY,N,["→"])
02100 SETZB COUNT,SIGN
02200 SKIPN CHAR
02300 LOOP2: GO [ CALL(GETCHW)
02400 LAC CHAR,1
02500 GO .+1 ]
02600 CAIN CHAR,15↔GO LOOP2
02700 LDB 1,[POINT 2,CHAR,35-7]
02800 LAC T1,CTABS(1)
02900 LAC T2,CHAR↔ANDI T2,177
03000 CAIL T2,"0"↔CAIL T2,"9"↔GO NOTNUM
03100 TRNN CHAR,200↔GO NOTNUM
03200 IMULI COUNT,=10
03300 ADDI COUNT,-"0"(T2)
03400 GO LOOP2
03500 NOTNUM: CAIL T2,"a"↔CAILE T2,"z"↔GO LOOP3
03600 SUBI T2,40
03700 LOOP3: CAR 0,(T1)
03800 CAIE 0,(T2)↔AOBJN T1,LOOP3
03900 CAIE 0,(T2)
04000 GO [ TRNN CHAR,200↔GO LINED
04100 UNKNOWN: OUTSTR[ASCIZ/Unknown command: /]
04200 TRNE CHAR,200↔OUTSTR[ASCIZ/<control>/]
04300 TRNE CHAR,400↔OUTSTR[ASCIZ/<meta>/]
04400 OUTCHR CHAR↔GO LOOP0 ]
04500 CDR T2,(T1)
04600 GO(T2)
00100 ;----- EDTEXT ;COMMAND TABLES
00200
00300 CTABS: FOR @` I←0,3,1
00400 < XWD -CLEN`I,CTAB`I
00500 >
00600 CTAB0: XWD 12,[MOVEI 0,1↔GO MOVER]
00700 XWD 177,[MOVNI 0,1↔GO MOVER]
00800 XWD 13,[MOVNI 0,1↔GO MOVER]
00900 XWD 175,LOOP0
01000 CLEN0←←.-CTAB0
01100 CTAB1:
01200 ;Commands to system line editor (includes <space> and <tab>:
01300 FOR I ε {DIKS }
01400 < XWD "I",LINED
01500 >
01600 XWD 12,[MOVEI 0,1↔GO MOVER]
01700 CTAB3: XWD 13,[MOVNI 0,1↔GO MOVER] ;VT
01800 XWD "<",[MOVNI 0,4↔GO MOVER]
01900 XWD ">",[MOVEI 0,4↔GO MOVER]
02000 XWD "≤",[MOVNI 0,16↔GO MOVER]
02100 XWD "≥",[MOVEI 0,16↔GO MOVER]
02200
02300 XWD "↑",[MOVNI 0,1↔MOVEI CHAR,211↔GO MOVER2]
02400 XWD "↓",[MOVEI 0,1↔MOVEI CHAR,211↔GO MOVER2]
02500 XWD "Q",[TCW 1,N↔TESTZ 1,VBIT↔GO LOOP0
02600 SETZ CHAR,↔CALL(EDSYS+1,N,CHAR)
02700 GO LOOP]
02800 XWD "/",CHGSIZ ;SHRINK DPY CHR SIZE.
02900 XWD "\",CHGSIZ ;EXPAND DPY CHR SIZE.
03000 XWD "V",UPGEO ;REFRESH.
03100 XWD "Z",JOIN
03200 XWD "+",[MOVEI SIGN,1↔GO LOOP2]
03300 XWD "-",[SKIPN SIGN↔MOVEI SIGN,1
03400 MOVN SIGN,SIGN↔GO LOOP2]
03500 XWD "E",[EDEXIT: PGIOT 2,↔POP1J]
03600 XWD "M",[SETZM CTRL↔SETZM META
03700 CALL(NEWMAC)↔GO LOOP0]
03800 XWD "N",[SETZM CTRL↔SETZM META
03900 CALL(IFORM2)↔GO LOOP0]
04000 CLEN1←←.-CTAB1
04100 XWD 12,INSLIN
04200 XWD "I",INSLIN
04300 XWD "D",DELLIN
04400 CLEN3←←.-CTAB3
04500 CTAB2: XWD 12,UNKNOWN
04600 CLEN2←←.-CTAB2
00100 ;----- EDTEXT ;COMMAND ROUTINES
00200
00300 MOVER: SETZ CHAR,
00400 MOVER2: SKIPN COUNT
00500 MOVEI COUNT,1
00600 IMUL COUNT,0
00700 SKIPGE SIGN
00800 MOVN COUNT,COUNT
00900 JUMPL COUNT,BACK
01000 SETZM ENDFLG
01100 FORWRD: CALL NXTLIN,N
01200 JUMPE 1,[SETOM ENDFLG
01300 GO LOOP]
01400 LAC N,1
01500 SOJG COUNT,FORWRD
01600 GO LOOP
01700 BACK: SKIPE ENDFLG
01800 GO [ SETZM ENDFLG
01900 GO BACK2 ]
02000 BACK1: CALL PRVLIN,N
02100 TESTZ 1,VBIT
02200 GO LOOP
02300 LAC N,1
02400 BACK2: AOJL COUNT,BACK1
02500 GO LOOP
02600
02700 LINED: SKIPE ENDFLG
02800 GO [ CAIL CHAR,177
02900 GO UNKNOWN
03000 CALL(INSTXT,N)
03100 LAC N,1
03200 SETZM ENDFLG
03300 GO LINED ]
03400 CALL EDSYS,N,CHAR
03500 DAC 1,CHAR
03600 GO LOOP
03700
03800 INSLIN: TCW N,N
03900 JUMPG COUNT,INSLI2
04000 NEWTXT: CALL(INSTXT,N)
04100 DAC 1,N
04200 CALL(EDDPY,N,["↔"])
04300 SETZM CLRLIN
04400 CALL(EDSYS,N,[0])
04500 CAIN 1,12
04600 GO NEWTXT
04700 GO LOOP0
04800 INSLI2: CALL(INSTXT,N)
04900 SOJG COUNT,INSLI2
05000 CALL(PRVLIN,N)
05100 GO LOOP0
05200
05300 DELLIN: SKIPE ENDFLG
05400 GO LOOP0
05500 SKIPE SIGN
05600 IMULI COUNT,SIGN
05700 JUMPL COUNT,DBACK
05800 DELLI2: CALL(KLTEXT,N)
05900 LAC N,1
06000 TESTZ N,VBIT
06100 GO [ PTEXT 1,N
06200 GO DELLI3 ]
06300 TCCW 1,N
06400 DELLI3: JUMPE 1,[ TESTZ N,VBIT
06500 GO [ OUTSTR[ASCIZ/NOTHING LEFT!/]
06600 GO EDEXIT ]
06700 SETOM ENDFLG
06800 GO LOOP0 ]
06900 LAC N,1
07000 SOJG COUNT,DELLI2
07100 GO LOOP0
07200 DBACK: CALL(KLTEXT,N)
07300 LAC N,1
07400 TESTZ N,VBIT
07500 GO [ PTEXT N,N
07600 JUMPE N,[ OUTSTR[ASCIZ/NOTHING LEFT!/]
07700 GO EDEXIT ]
07800 GO LOOP0 ]
07900 TLNE 0,(CONBIT)
08000 SUBI COUNT,1
08100 DBACK2: AOJL COUNT,DBACK
08200 GO LOOP0
08300
08400 JOIN: CALL(NXTLIN,N)
08500 JUMPE 1,LOOP0
08600 TCW 1,1
08700 MARK 1,CONBIT
08800 GO LOOP0
08900
09000 CHGSIZ: LAC 1,N
09100 TEST 1,VBIT
09200 GO [ TCW 1,1
09300 GO CHGSIZ+1 ]
09400 DPSIZ 0,1
09500 CAIE CHAR,200+"/"
09600 CAIN CHAR,600+"/"
09700 SUBI 0,1
09800 CAIE CHAR,200+"\"
09900 CAIN CHAR,600+"\"
10000 ADDI 0,1
10100 ANDI 0,7 ;MUMBLE
10200 DPSIZ. 0,1
10300 UPGEO: PUSHP N
10400 CALL GEODPY
10500 POPP N
10600 GO LOOP0
10700 ENDR EDTEXT;4-MAY-73(TVR)____________________________________________
00100 SUBR EDSYS,NODE,CHAR ;Invoke system line editor
00200 COMMENT ⊗------------------------------------------------------------
00300 Here we gronk the system line editor ⊗
00400 ACCUMULATORS{N,C1,C2,P1,P2}
00500 EXTERNAL FILFLG,MACNOD,MACGET
00600 TDZA 0,0 ;Set or clear Q command flag
00700 MOVEI 0,1
00800 DAC 0,FOOFLG
00900 LAC N,NODE ;Put text into EDBUF in preparation
01000 LAC P2,[POINT 7,EDBUF] ;for line edit
01100 MOVEI C2,5*EDBFLN-2
01200 CH1: LAC P1,N ;For each node
01300 HRLI P1,700
01400 MOVEI C1,5*8-1
01500 CHLOOP: ILDB 1,P1 ;Pick up a character
01600 JUMPE 1,CH2 ;Ignore nulls
01700 IDPB 1,P2 ;Put into EDBUF
01800 SOJL C2,[OUTSTR[ASCIZ/Too long for line editor!/] ;Error check
01900 CLRBFI↔SETZ 1,↔POP2J]
02000 CH2: SOJG C1,CHLOOP ;For each character
02100 TESTZ N,CONBIT ;More left?
02200 GO [ TCCW N,N ;Yes
02300 JUMPN N,CH1
02400 GO .+1 ]
02500 MOVEI 1,15 ;Make sure it ends with <return>
02600 IDPB 1,P2
02700 SETZ 0, ;Make sure it terminated with <null>
02800 IDPB 0,P2
02900 PTLOAD [0↔EDBUF] ;Stuff it into line buffer
03000 ;Here we should, but don't pick up anything typed ahead
03100 LAC 1,CHAR ;Pick up character starting command
03200 PTWR1W 0 ;Put it into input buffer
03300 LAC 1,CLRLIN+1 ;Turn off line to be editted
03400 PGSEL 17
03500 SKIPE CLRLIN ;Unless we're in Q command
03600 UPGMVM 1,@CLRLIN
03700 MOVEI C1,1 ;Now, how many lines from top
03800 LAC 1,N
03900 CH3: CALL(PRVLIN,1) ;Get previous node
04000 TEST 1,VBIT ;A vertex?
04100 AOJA C1,CH3 ;Yes, try next back
04200 IMULI C1,-30 ;Calculate line position
04300 ADDI C1,=460
04400 PPIOT 6,(C1) ;LAC line editor up there
04500 LAC 1,NODE ;Pick up node
04600 SKIPN FOOFLG ;If Q flag, then pick up display for new line
04700 GO CH4
04800 CALL(INSTXT,NODE) ;Insert a blank line to be filled
04900 DAC 1,NODE ;Save that line
05000 CALL(EDDPY,1,["→"]) ;A line and cursor
05100 CH4: SKIPN FILFLG ;In a macro mode?
05200 SKIPE MACNOD
05300 GO CH5 ;Yes, handle special
05400 TTYUUO 14, ;Wait for activation character
05500 CH6: CALL(SETEXT,NODE,[EDGET]) ;Now
05600 PPIOT 6,0 ;Reset page printer
05700 SETOM EDUPDATE ;Make it know this is an update
05800 LAC 1,BRKCHR ;Get back break character from line edit
05900 POP2J
06000 CH5: CALL(MACGET) ;Get a character from macro
06100 JUMPE 1,CH4 ;If zero, end of macro
06200 SETZ 0, ;Stuff character into input buffer
06300 PTWR1W 0
06400 LAC 0,1 ;Get low order 7 bits
06500 ANDI 0,177
06600 CAIL 0,"a" ;Convert to upper case
06700 CAILE 0,"z"
06800 SKIPA
06900 SUBI 0,40
07000 CAIE 0,12 ;<return> and <line> always terminate
07100 CAIN 0,15
07200 GO CH6
07300 CAIN 0,175 ;As does <alt mode>
07400 GO CH6
07500 CAIL 1,600 ;Always terminate if <control><meta>
07600 GO CH6
07700 CAIL 1,200 ;Not a terminator if no control bits
07800 CAIL 1,400 ;Or <meta>
07900 GO CH5
08000 CAIE 0,"S" ;Must be <control>, test each of edit commands
08100 CAIN 0,"I"
08200 GO CH5
08300 CAIE 0,"D"
08400 CAIN 0,"K"
08500 GO CH5
08600 CAIE 0,11
08700 CAIN 0,40
08800 GO CH5
08900 CAIE 0,14
09000 CAIN 0,177
09100 GO CH5
09200 GO CH6
09300
09400 EDGET: INCHSL 1
09500 POPJ P,
09600 CAIE 1,12
09700 CAIL 1,200
09800 GO [ DAC 1,BRKCHR
09900 GO EDGET ]
10000 CAIN 1,15
10100 GO [ INCHSL 1
10200 JFCL
10300 DAC 1,BRKCHR
10400 POPJ P,]
10500 CAIN 1,175
10600 GO BLAST
10700 AOS (P)
10800 POPJ P,
10900
11000 BLAST: SUB P,[XWD 4,4]
11100 BLAST0: PPIOT 6,0
11200 BLAST1: INCHSL 1
11300 GO BLAST2
11400 CAIE 1,15
11500 GO BLAST1
11600 INCHSL 1
11700 JFCL
11800 BLAST2: LAC P2,[POINT 7,EDBUF]
11900 CALL(SETEXT,NODE,[EDGET2])
12000 SETZ 1,
12100 POP2J
12200
12300 EDGET2: ILDB 1,P2
12400 JUMPE 1,[POPJ P,]
12500 AOS(P)
12600 POPJ P,
12700
12800 DECLARE{BRKCHR,FOOFLG}
12900
13000 ENDR EDSYS;4-MAY-73(TVR)_____________________________________________
00100 SUBR(EDDPY,NODE,CURCHR)
00200 COMMENT ⊗___________________________________________________________⊗
00300 EXTERNAL DPYPTR,RIVECT,DPYBRT
00400 N←4
00500 CALL(DPYSET,DPYBUF)
00600 CALL(DPYBIG,[2])
00700 CALL(DPYBRT,[2])
00800 CALL(AIVECT,[-777],[=460])
00900 CALL(DPYSTR,[[ASCIZ/*****************
01000 /]])
01100 LAC N,NODE
01200 SETZM CURFLG
01300 SKIPA
01400 FNDBEG: TCW N,N
01500 TEST N,VBIT
01600 GO FNDBEG
01700 PTEXT N,N
01800 DPLOOP: SKIPN ENDFLG
01900 CAME N,NODE
02000 GO DP2
02100 CALL(DPYCUR)
02200 DP2: MOVEI 0,1(N)
02300 CALL(DPYSTR,0)
02400 TESTZ N,CONBIT
02500 GO [ TCCW N,N
02600 JUMPN N,DP2
02700 FATAL(MISSING END TO TEXT)]
02800 CALL(DPCRLF)
02900 TCCW N,N
03000 JUMPN N,DPLOOP
03100 DP3: SKIPN ENDFLG
03200 GO DP4
03300 CALL(DPYCUR)
03400 DP4: CALL(DPYSTR,[[ASCIZ/********/]])
03500 CALL(DPCRLF)
03600 CALL(DPYOUT,[17])
03700 POP2J
03800
03900 .PLEVEL←←.PLEVEL+1
04000 DPYCUR: CALL(RIVECT,[-15],[0])
04100 CDR 1,DPYPTR
04200 DAC 1,CLRLIN
04300 SETOM CURFLG
04400 CALL(DTYO,CURCHR)
04500 CALL(DPYSTR,<[[BYTE(7) " ",15,0]]>)
04600 POPJ P,
04700 .PLEVEL←←.PLEVEL-1
04800
04900 DPCRLF: SKIPN CURFLG
05000 GO DPCRL2
05100 SETZM CURFLG
05200 MOVSI 1,000700
05300 HLLM 1,DPYPTR
05400 HRLZ 1,DPYPTR
05500 ADD 1,[XWD 1,20]
05600 DAC 1,CLRLIN+1
05700 DPCRL2: CALL(DPYSTR,[[ASCIZ/
05800 /]])
05900 POPJ P,
06000
06100 DECLARE{CURFLG}
06200
06300 ENDR EDDPY;4-MAY-73(TVR)_____________________________________________
00100 SUBR(INSTXT,NODE)
00200 ;Insert a text node in after of NODE. Return new node in 1.
00300 ;
00400 ;Uses AC 0-1, Transparent to all others
00500 ;Calls MKNODE
00600 ACCUMULATORS{NEXT,LAST}
00700 PUSHP NEXT
00800 PUSHP LAST
00900 LAC LAST,NODE
01000 JUMPE LAST,[FATAL(INSTXT called with NIL)]
01100 TESTZ LAST,VBIT
01200 GO L2
01300 L0: TCCW 0,LAST
01400 JUMPE 0,L2
01500 LAC LAST,0
01600 TESTZ LAST,CONBIT
01700 GO L0
01800 L2: CALL(MKNODE↑,[$TEXT]) ;Make a new text node
01900 TESTZ LAST,VBIT ;Are we inserting at beginning of text list?
02000 GO [ PTEXT NEXT,LAST ;Yes, special pointers
02100 PTEXT. 1,LAST
02200 GO L1 ]
02300 TCCW NEXT,LAST ;Get next node
02400 TCCW. 1,LAST ;Make new forward link
02500 L1: TCCW. NEXT,1
02600 TCW. LAST,1 ;Make new backward links
02700 SKIPE NEXT↔TCW. 1,NEXT ;Don't store into NIL
02800 POPP LAST
02900 POPP NEXT
03000 POP1J
03100 ENDR INSTXT;4-MAY-73(TVR)____________________________________________
00100 SUBR(NXTLIN,NODE)
00200 COMMENT ⊗___________________________________________________________
00300 Return pointer to next line, 0 if last line. Uses AC 0-1.⊗
00400 LAC 1,NODE ;Fetch node
00500 TESTZ 1,VBIT ;Is it a vertex?
00600 GO [ PTEXT 1,1 ;Yes, Next is alway the PTEXT link
00700 POP1J ]
00800 LOOP1: TESTZ 1,CONBIT ;Is node at end of line?
00900 GO [ TCCW 1,1 ;No, get another and try again
01000 GO LOOP1 ]
01100 TCCW 1,1 ;Now the next character will be a new line
01200 POP1J ;Return
01300 ENDR NXTLIN;6-MAY-73(TVR)____________________________________________
01400
01500 SUBR(PRVLIN,NODE)
01600 ;Returns pointer to previous line or vertex if called with first line
01700 ;
01800 ;Uses AC 0-1
01900 ;
02000 LAC 1,NODE ;Fetch node
02100 TESTZ 1,VBIT ;Lose if at vertex
02200 GO [ FATAL(PRVLIN called with VERTEX) ]
02300 TCW 1,1 ;Get previous node
02400 TESTZ 1,VBIT ;Is it the vertex?
02500 POP1J ;Yes, return in
02600 LOOP: TCW 1,1 ;Find end of previous line
02700 TESTZ 1,VBIT ;Is it a line
02800 GO [ PTEXT 1,1 ;No, the line starts thru PTEXT link
02900 POP1J ]
03000 TLNE 0,(CONBIT) ;Is it an end of line?
03100 GO LOOP ;No, try next one back
03200 TCCW 1,1 ;Now, go forward one and that's the line
03300 POP1J ;Now, if the first node instead of the last
03400 ;were noted, this would be alot easier!
03500 ENDR PRVLIN;6-MAY-73(TVR)____________________________________________
00100 CLRLIN: BLOCK 2
00200 EDBUF: BLOCK =21
00300 EDBFLN←←.-EDBUF
00400 DECLARE{EDUPDATE,ENDFLG}
00500 END